package dataStruct.queue.ex1;

/**
 * Created by thinkpad on 2016/8/24.
 */
// 自从Java 1.5之后，在java.util.concurrent包下提供了若干个阻塞队列，主要有以下几个：
// ArrayBlockingQueue：基于数组实现的一个阻塞队列，在创建ArrayBlockingQueue对象时必须制定容量大小。并且可以指定公平性与非公平性，默认情况下为非公平的，即不保证等待时间最长的队列最优先能够访问队列。
// LinkedBlockingQueue：基于链表实现的一个阻塞队列，在创建LinkedBlockingQueue对象时如果不指定容量大小，则默认大小为Integer.MAX_VALUE。
// PriorityBlockingQueue：以上2种队列都是先进先出队列，而PriorityBlockingQueue却不是，它会按照元素的优先级对元素进行排序，按照优先级顺序出队，每次出队的元素都是优先级最高的元素。注意，此阻塞队列为无界阻塞队列，即容量没有上限（通过源码就可以知道，它没有容器满的信号标志），前面2种都是有界队列。
// DelayQueue：基于PriorityQueue，一种延时阻塞队列，DelayQueue中的元素只有当其指定的延迟时间到了，才能够从队列中获取到该元素。DelayQueue也是一个无界队列，因此往队列中插入数据的操作（生产者）永远不会被阻塞，而只有获取数据的操作（消费者）才会被阻塞。
//功能说明：由于部署阿里云的SLS日志服务，写了个日志接口，考虑到系统日志量提交有可能会阻塞，这里引入了线程池（生存者与消费者模式）来维护日志队列的发送。一个发送消息模块将消息发送到消息队列中，无需等待返回结果，发送模块继续执行其他任务。消息队列中的指令由线程池中的线程来处理。使用一个Queue来存放线程池溢出时的任务
//TestDriver.java是一个驱动测试，sendMsg方法不间断的向ThreadPoolManager发送数据

public class TestDriver {
    ThreadPoolManager tpm = ThreadPoolManager.newInstance();
    public void sendMsg( String msg ) {
        tpm.addLogMsg( msg + "记录一条日志 " );
    }

    public static void main(String[] args) {
        for(int i=0;i<10;i++){
            new TestDriver().sendMsg( Integer.toString( i ) );
        }
        //new TestDriver().sendMsg("发起一条对象" );
    }
}